<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="ApOrE" id="ApOrE"><span data-lake-id="ub3f18a69" id="ub3f18a69">典型回答</span></h1>
  <p data-lake-id="ue4eeefad" id="ue4eeefad"><br></p>
  <p data-lake-id="ue1293e2a" id="ue1293e2a"><span data-lake-id="uf771dc46" id="uf771dc46">一次InnnoDB的update操作，涉及到BufferPool、BinLog、UndoLog、RedoLog以及物理磁盘，完整的一次操作过程基本如下：</span></p>
  <p data-lake-id="u7f75304b" id="u7f75304b"><span data-lake-id="u0430c26a" id="u0430c26a">​</span><br></p>
  <p data-lake-id="u9b635bd8" id="u9b635bd8"><span data-lake-id="ub7565fc3" id="ub7565fc3">1、在Buffer Pool中读取数据：当InnoDB需要更新一条记录时，首先会在Buffer Pool中查找该记录是否在内存中。如果没有在内存中，则从磁盘读取该页到Buffer Pool中。</span></p>
  <p data-lake-id="u7861fae7" id="u7861fae7"><span data-lake-id="u94c7d942" id="u94c7d942">​</span><br></p>
  <p data-lake-id="u1fd2bbc3" id="u1fd2bbc3"><span data-lake-id="u98443627" id="u98443627">2、记录UndoLog：在修改操作前，InnoDB会在Undo Log中记录修改前的数据。Undo Log是用来保证事务原子性和一致性的一种机制，用于在发生事务回滚等情况时，将修改操作回滚到修改前的状态，以达到事务的原子性和一致性。UndoLog的写入最开始写到内存中的，然后由1个后台线程定时刷新到磁盘中的。</span></p>
  <p data-lake-id="ucbcd8e60" id="ucbcd8e60"><span data-lake-id="u3853fdd2" id="u3853fdd2">​</span><br></p>
  <p data-lake-id="u990a4f4a" id="u990a4f4a"><span data-lake-id="u65831c3a" id="u65831c3a">3、在Buffer Pool中更新：当执行update语句时，InnoDB会先更新已经读取到Buffer Pool中的数据，而不是直接写入磁盘。同时，InnoDB会将修改后的数据页状态设置为“脏页”（Dirty Page）状态，表示该页已经被修改但尚未写入磁盘。</span></p>
  <p data-lake-id="u8afbdd99" id="u8afbdd99"><span data-lake-id="uaa3e727b" id="uaa3e727b">​</span><br></p>
  <p data-lake-id="u0fc99401" id="u0fc99401"><span data-lake-id="u70dec856" id="u70dec856">4、记录RedoLog Buffer：InnoDB在Buffer Pool中记录修改操作的同时，InnoDB 会先将修改操作写入到 redo log buffer 中。</span></p>
  <p data-lake-id="u5264d7a4" id="u5264d7a4"><span data-lake-id="u04cc7889" id="u04cc7889">​</span><br></p>
  <p data-lake-id="u5b19a0b6" id="u5b19a0b6"><span data-lake-id="ue59bd81a" id="ue59bd81a">5、提交事务：在执行完所有修改操作后，事务被提交。在提交事务时，InnoDB会将Redo Log写入磁盘，以保证事务持久性。</span></p>
  <p data-lake-id="u9fd38a10" id="u9fd38a10"><span data-lake-id="uc4bd3c75" id="uc4bd3c75">​</span><br></p>
  <p data-lake-id="u3dc859d9" id="u3dc859d9"><span data-lake-id="u3c02c5a5" id="u3c02c5a5">6、写入磁盘：在提交过程后，InnoDB会将Buffer Pool中的脏页写入磁盘，以保证数据的持久性。但是这个写入过程并不是立即执行的，是有一个后台线程异步执行的，所以可能会延迟写入，总之就是MYSQL会选择合适的时机把数据写入磁盘做持久化。</span></p>
  <p data-lake-id="uddacf058" id="uddacf058"><span data-lake-id="u71d55f53" id="u71d55f53">​</span><br></p>
  <p data-lake-id="u5ed2df99" id="u5ed2df99"><span data-lake-id="ue98fbcac" id="ue98fbcac">7、记录Binlog：在提交过程中，InnoDB会将事务提交的信息记录到Binlog中。Binlog是MySQL用来实现主从复制的一种机制，用于将主库上的事务同步到从库上。在Binlog中记录的信息包括：事务开始的时间、数据库名、表名、事务ID、SQL语句等。</span></p>
  <p data-lake-id="u9e44b490" id="u9e44b490"><span data-lake-id="u79e644e9" id="u79e644e9">​</span><br></p>
  <p data-lake-id="u8b6f8eca" id="u8b6f8eca"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1692360052478-7a123e12-d590-438f-9abd-c968f0b7b2bb.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_36%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ucf584898" id="ucf584898"><br></p>
  <p data-lake-id="u4ff605f0" id="u4ff605f0"><span data-lake-id="ued43dbfe" id="ued43dbfe">需要注意的是，在binlog和redolog的写入过程中，其实是分成了2阶段的，通过2阶段提交的方式来保证一致性的。</span></p>
  <p data-lake-id="u0324740d" id="u0324740d"><span data-lake-id="uba5226c8" id="uba5226c8">​</span><br></p>
  <h1 data-lake-id="nfA49" id="nfA49"><span data-lake-id="udbab8b75" id="udbab8b75">扩展知识</span></h1>
  <p data-lake-id="u46052a74" id="u46052a74"><br></p>
  <h2 data-lake-id="TZpwD" id="TZpwD"><span data-lake-id="uf5df1377" id="uf5df1377">二阶段提交</span></h2>
  <p data-lake-id="u4291bb97" id="u4291bb97"><br></p>
  <p data-lake-id="u9301e304" id="u9301e304"><span data-lake-id="u612ddc06" id="u612ddc06">​</span><br></p>
  <p data-lake-id="ue5a72a7f" id="ue5a72a7f"><br></p>
 </body>
</html>